package tbs.framework.base.model;

import lombok.Data;

import java.io.Serializable;

/**
 * 通用结果模型类，用于封装API响应结果 该类提供了成功和失败的静态工厂方法，以便于创建常用的结果对象
 *
 * @param <T> 泛型参数，表示结果中携带的数据类型
 * @author tongj
 */
@Data
public class ResultModel<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    public static final int SUCCESS = 0, FAILURE = 1;

    /**
     * 状态码，表示操作成功或失败
     */
    private Integer status;
    /**
     * 消息，描述操作结果的信息
     */
    private String message;
    /**
     * 数据，表示操作结果返回的数据
     */
    private T data;

    /**
     * 构造方法，用于创建ResultModel对象
     *
     * @param status  状态码，表示操作成功或失败
     * @param message 消息，描述操作结果的信息
     * @param data    数据，表示操作结果返回的数据
     */
    public ResultModel(Integer status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    /**
     * 创建一个表示成功的ResultModel对象，不包含消息和数据
     *
     * @return 成功的ResultModel对象
     */
    public static ResultModel<Void> success() {
        return new ResultModel<Void>(SUCCESS, null, null);
    }

    /**
     * 创建一个表示成功的ResultModel对象，包含消息
     *
     * @param message 成功消息
     * @return 成功的ResultModel对象
     */
    public static ResultModel<Void> successWithMessage(String message) {
        return new ResultModel<Void>(SUCCESS, message, null);
    }

    /**
     * 创建一个表示成功的ResultModel对象，包含数据
     *
     * @param data 成功时返回的数据
     * @return 成功的ResultModel对象
     */
    public static <T> ResultModel<T> success(T data) {
        return new ResultModel<T>(SUCCESS, null, data);
    }

    /**
     * 创建一个表示成功的ResultModel对象，包含消息和数据
     *
     * @param message 成功消息
     * @param data    成功时返回的数据
     * @return 成功的ResultModel对象
     */
    public static <T> ResultModel<T> success(String message, T data) {
        return new ResultModel<T>(SUCCESS, message, data);
    }

    /**
     * 创建一个表示失败的ResultModel对象，不包含消息和数据
     *
     * @return 失败的ResultModel对象
     */
    public static ResultModel<Void> failure() {
        return new ResultModel<Void>(FAILURE, null, null);
    }

    /**
     * 创建一个表示失败的ResultModel对象，包含消息
     *
     * @param message 失败消息
     * @return 失败的ResultModel对象
     */
    public static ResultModel<Void> failureWithMessage(String message) {
        return new ResultModel<Void>(FAILURE, message, null);
    }

    /**
     * 创建一个表示失败的ResultModel对象，包含数据
     *
     * @param data 失败时返回的数据
     * @return 失败的ResultModel对象
     */
    public static <T> ResultModel<T> failure(T data) {
        return new ResultModel<T>(FAILURE, null, data);
    }

    /**
     * 创建一个表示失败的ResultModel对象，包含消息和数据
     *
     * @param message 失败消息
     * @param data    失败时返回的数据
     * @return 失败的ResultModel对象
     */
    public static <T> ResultModel<T> failure(String message, T data) {
        return new ResultModel<T>(FAILURE, message, data);
    }
}
